package com.glink.manage.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.glink.common.exception.GeneralSimpleException;
import com.glink.manage.domain.PatrolIntelligentEquip;
import com.glink.manage.domain.PatrolIntelligentEquipChannel;
import com.glink.manage.dto.constructionwork.ConstructionWorkSiteIdOrEquipObjIdDTO;
import com.glink.manage.dto.equip.PatrolIntelligentEquipBroadcastStatusDTO;
import com.glink.manage.dto.equip.PatrolIntelligentEquipDTO;
import com.glink.manage.dto.equip.PatrolIntelligentEquipPageDTO;
import com.glink.manage.dto.sip.UpdateStatusDTO;
import com.glink.manage.dto.video.*;
import com.glink.manage.vo.constructionwork.ConstructionWorkAndWorkSiteInfoVO;
import com.glink.manage.vo.equip.PatrolIntelligentEquipNvrVO;
import com.glink.manage.vo.equip.PatrolIntelligentEquipVO;
import com.glink.manage.vo.overview.IntelligentEquipVO;
import com.glink.manage.vo.video.*;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;


/**
 * @author  glink
 * @since  2024-07-01
 */
public interface PatrolIntelligentEquipService extends IService<PatrolIntelligentEquip> {
    /**
     * 新增智能设备
     */
    boolean insertIntelligentEquip(PatrolIntelligentEquipDTO dto, String remoteIp) throws GeneralSimpleException;

    /**
     * 数据下发
     * @param equip 主数据
     * @param equipChannelList 通道数据
     */
    void dataDistribute(PatrolIntelligentEquip equip, List<PatrolIntelligentEquipChannel> equipChannelList);

    /**
     * 更新智能设备
     */
    boolean updateIntelligentEquip(PatrolIntelligentEquipDTO dto, String remoteIp) throws GeneralSimpleException;

    /**
     * 分页查询(设备)
     * @param dto
     * @return IPage<PatrolIntelligentEquipVO>
     */
    IPage<PatrolIntelligentEquipVO> findPageEquip(PatrolIntelligentEquipPageDTO dto)throws GeneralSimpleException;

    /**
     * 分页查询(NVR)
     * @param dto
     * @return IPage<PatrolIntelligentEquipVO>
     */
    IPage<PatrolIntelligentEquipNvrVO> findPageNvr(PatrolIntelligentEquipNvrPageDTO dto) throws GeneralSimpleException;

    /**
     * 根据类型分页智能设备
     * @param dto
     * @return IPage<PatrolIntelligentEquipVO>
     */
    IPage<PatrolIntelligentEquipVO> findPageEquipByDeviceType(PatrolIntelligentEquipSearchDTO dto);

    /**
     * 根据主键查询摄像机信息
     */
    PatrolIntelligentEquipVO findById(String objId);

    /**
     * 根据主键查询硬盘录像机信息
     */
    PatrolIntelligentEquipNvrVO findNvrById(String objId);

    /**
     * 根据通道查询智能设备
     */
    PatrolIntelligentEquipSimpleVO findByChannelCode(String channelCode);

    /**
     * 根据间隔查询列表
     */
    List<PatrolIntelligentEquipTreeVO> findByWorkSiteId(String bayId, String runStatus, String isOnline,String deviceType,String name);

    /**
     * 根据区域查询列表(已启用数据)
     */
    List<PatrolIntelligentEquipVO> findByAreaId(PatrolIntelligentEquipInspectionDTO dto);

    /**
     * 查询厂站下各类摄像机数
     * @param stationId 厂站ID
     */
    List<IntelligentEquipVO> findIntelligentEquipOverview(String stationId);

    /**
     * 根据主键列表查询信息
     */
    List<PatrolIntelligentEquip> findByIdList(List<String> idList);

    /**
     * 查询区域下摄像机数
     * @param areaId 区域ID
     */
    Integer countByAreaId(String areaId);

    /**
     * 查询间隔下摄像机数
     * @param bayIds 间隔ID
     */
    Integer countByBayIds(List<String> bayIds);

    /**
     * 删除摄像机(可批量)
     */
    boolean deleteEquipByList(List<String> objIds, String remoteIp) throws GeneralSimpleException;

    /**
     * 删除Nvr(可批量)
     */
    boolean deleteNvrByList(List<String> objIds, String remoteIp) throws GeneralSimpleException;

    /**
     * 导出摄像机
     * @param dto
     * @return
     */
    String exportEquip(PatrolIntelligentEquipQueryDTO dto) throws Exception;

    /**
     * 导出声纹
     * @param dto
     * @return
     */
    String exportEquipVoice(PatrolIntelligentEquipVoiceQueryDTO dto) throws Exception;

    /**
     * 导出Nvr
     * @param dto
     * @return
     */
    String exportEquipNvr(PatrolIntelligentEquipNvrQueryDTO dto) throws Exception;

    /**
     * Nvr关联摄像机
     */
    boolean relateEquips(PatrolIntelligentEquipNvrRelateDTO dto);

    /**
     * 摄像机树形数据
     */
    List<PatrolIntelligentEquipTreeVO> findTree(PatrolIntelligentEquipTreeDTO dto) throws GeneralSimpleException;

    /**
     * 排除项目部的工程树
     * @param dto 查询条件
     * @return 工程树
     * @throws GeneralSimpleException 异常
     */
    List<PatrolIntelligentEquipTreeVO> findTreeExcludeProjectDepartment(PatrolIntelligentEquipTreeDTO dto) throws GeneralSimpleException;
    
    /**
     * 查询工程-施工现场树形数据
     */
    List<PatrolIntelligentEquipTreeVO> findWorkAndWorkSiteTree() throws GeneralSimpleException;

    /**
     * 声纹树形数据
     */
    PatrolIntelligentEquipVoiceTreeVO findVoiceTree(PatrolIntelligentEquipTreeDTO dto);

    /**
     * 请求边端同步
     */
    Boolean callRemote(PatrolIntelligentEquipDTO dto) throws GeneralSimpleException;

    /**
     * 批量智能设备同步
     */
    Boolean callSysList(List<String> objIds);

    /**
     * 根据设备编码查询设备ID
     * @param patrolDeviceCode 设备编码
     * @return 设备ID
     */
    String findIdByPatrolDeviceCode(String stationId, String patrolDeviceCode);

    /**
     * 根据智能设备编码查询摄像机信息
     * @param patrolDeviceCode 智能设备编码
     * @return 摄像机信息
     */
    PatrolIntelligentEquipSimpleVO findByPatrolDeviceCode(String patrolDeviceCode);

    /**
     * 根据所属区域或者摄像机名称查询摄像机列表
     * @param equipListDTO 查询条件
     * @return 摄像机列表
     */
    List<PatrolIntelligentEquipListVO> findIntelligentEquipListByArea(PatrolIntelligentEquipListDTO equipListDTO);

    /**
     * 根据点位ID查询摄像机列表
     * @param measurePointId 点位ID
     * @return 摄像机列表
     */
    PatrolIntelligentEquipListVO findIntelligentEquipListByPointId(String stationId, String measurePointId);

    /**
     * 根据Nvr查询关联摄像机列表
     */
    List<PatrolIntelligentEquipChannelNvrVO> findByNvrId(String belongEquipId);

    /**
     * 根据设备ID查询一个通道号
     *
     * @param equipId 设备ID
     * @return 通道号
     */
    PatrolIntelligentEquipChannelSimpleVO findOneChannelNumberById(String equipId);

    /**
     * 根据设备编码，查询设备信息
     * @param patrolDeviceCodeList 设备编码
     */
    List<PatrolIntelligentEquipSimpleVO> findByPatrolDeviceCodeIn(List<String> patrolDeviceCodeList);


    /**
     * 根据设备编码，查询设备信息
     * @param patrolId 设备主键
     */
    List<PatrolIntelligentEquipSimpleVO> findByPatrolIdIn(String patrolId);

    /**
     * 根据设备编码类型查询设备信息
     * @param patrolDeviceCodeList 设备编码
     * @return
     */
    List<PatrolIntelligentEquipSimpleVO> findByTypeAndPatrolDeviceCodeList(List<String> patrolDeviceCodeList, String deviceType);

    /**
     * 查询未关联NVR的通道列表
     * @param dto
     * @return
     */
    IPage<PatrolIntelligentEquipChannelNvrVO> findNoRelatePage(PatrolIntelligentEquipChannelNvrDTO dto)throws GeneralSimpleException;


    /**
     * 下发摄像机台账
     * @param equipId 摄像机ID
     */
    void dataDistributeByEquipId(String equipId);

    /**
     *  批量同步未同步成功的智能设备-摄像机
     */
    void batchSync();

    /**
     * 更新同步状态信息
     * @param objId 智能设备ID
     * @param syncStatus 同步状态
     * @param syncTime 同步时间
     * @param syncFailMsg 同步失败信息
     * @param syncFailTime 同步失败时间
     */
    void updateSyncInfo(String objId, String syncStatus, Date syncTime, String syncFailMsg, Date syncFailTime);

    /**
     * 根据厂站和设备类型查询设备ID
     * @param stationId 厂站ID
     * @param deviceType 设备类型
     * @return 设备ID
     */
    List<String> findPatrolDeviceCodeByStationIdAndDeviceType(String stationId, String deviceType);

    /**
     * 下发智能设备台账
     * @param equip 智能设备
     */
    void dataDistributeNotSync(PatrolIntelligentEquip equip, List<PatrolIntelligentEquipChannel> equipChannelList);

    /**
     * 根据通道编码更新摄像机离线状态
     * @param dto
     * @return
     */
    boolean updateStatusByIds(UpdateStatusDTO dto);

    /**
     * 根据区域查询声纹装置设备
     * @param equipListDTO 智能设备查询条件
     * @return 声纹装置列表
     */
    List<PatrolIntelligentEquipVoiceListVO> findVoiceListByArea(PatrolIntelligentEquipListDTO equipListDTO);

    /**
     * 根据设备出场序列号查询厂站ID
     * @param productCode 出场序列号
     * @return 厂站ID
     */
    String findStationIdByproductCode(String productCode);

    /**
     * 根据智能设备编码查询智能设备名称
     * @param patrolDeviceCodeSet 智能设备编码
     * @return 智能设备名称
     */
    Map<String, String> findNameByPatrolDeviceCode(Set<String> patrolDeviceCodeSet);

    /**
     * 向外网视频代理添加设备
     */
    void addInternetProxyMedia(PatrolIntelligentEquip equip, List<String> channelCodeList) throws GeneralSimpleException;

    /**
     * 摄像机接入协议更改
     */
    void updateProxyMedia(String oldAgreement,PatrolIntelligentEquip equip,List<String> channelCodeList) throws GeneralSimpleException;

    /**
     * 删除摄像机
     */
    void deleteProxyMedia(PatrolIntelligentEquip equip,List<String> channelCodeList) throws GeneralSimpleException;

    /**
     * 根据施工现场id/摄像机id获取所属工程及现场信息
     * @param dto 施工现场id/摄像机id
     * @return 所属工程及现场信息
     */
    public ConstructionWorkAndWorkSiteInfoVO findWorkAndWorkSiteInfoByWorksiteIdOrEquipObjId(ConstructionWorkSiteIdOrEquipObjIdDTO dto);

    /**
     * 发送设备喊话状态
     * @param statusDTO 喊话状态
     */
    void sendDeviceBroadcastStatus(PatrolIntelligentEquipBroadcastStatusDTO statusDTO);
}
